// JS objects

// examples: bank, account, dog; states: holder, balance, type; behaviours: withdraw, deposit, suspend
// поведенията се реализират чрез функции, а чрез тях се променят състоянията на обектите
// обект е инстанция на клас
// обектите в JS са като речниците в C#
// обектите са единствените референтни типове в JS, т.е. когато подаваме на функция примитивен тип, engine-ът си прави негово копие в паметта и работи с него, от което следва, че дори и да му променим стойността, стойността на променливата, която служи за параметър не се променя, а ако подадем обект и итерираме с него във функция, променяме стойността на референцията

var person =
{
	eyes: [left, right],
	male: true,
	age: 24,
	address:
	{
		city: "Sofia",
		country: "Bulgaria"
	},
	firstName: "Meroslav",
	toString: function funcName()
	{
		return this.firstName;
	}
}

function buildPerson(fname, lname)
{
	return
	{
		fname: fname,
		lname: lname,
		toString: function()
		{
			return this.fname + " " + this.lname;
		}
	}
}
var tsaakoff = buildPerson('Meroslav', 'Tsaakoff');
console.log(tsaakoff.toString());

function buildPerson(fname, lname)
{
	function getNames(firstName, lastName)
	{
		return firstName + " " + lastName;
	}
	
	return
	{
		fname: fname,
		lname: lname,
		toString: getNames
	};
}
var tsaakoff = buildPerson('Meroslav', 'Tsaakoff');
console.log(tsaakoff.toString(tsaakoff.fname, tsaakoff.lname));

for in за достъпване на всички пропъртита и можем да изпълним всички функции от пропъртита с prop()